Podsumowanie wykonanej analizy

Jednym z główną rzeczy, na którą należało zwrócić uwagę podczas pracy z udostępnionymi zbiorami danych, jest ich różnorodność. Każdy z zestawów tematycznym charakteryzuje się własną strukturą. Przed wczytaniem zbiorów danych należało uważnie przeanalizować budowę poszczególnego pliku. Również niedogodności jest różnorodność atrybutów czasowych, dla których były zbierane dane. Czas w wybranych zestawach danych był odmierzany każdego dnia, albo z upływem miesiąca, lub roku. Tak różne dziedziny czasu nie można ze sobą połączyć bez wczesniejszej analizy, przez co analiza różnych zbiorów danych staje się nieprzystępna.

Innym problemem widocznym w wielu zestawach danych jest problem wartości pustych. Ich znaczna ilość w wypadku niektórych atrybutów pozbawia sensu brania rzadkich kolumn pod uwagę podczas przeprowadzania jakichkolwiek analiz.

Wykorzystane biblioteki

Biblioteki wspomagające wczytywanie i modyfikację danych:

library(dplyr)
library(tidyr)
library(readr)
library(readxl)
library(rmarkdown)

Biblioteki wspomagające wizualizację danych:

library(ggplot2)
library(plotly)
library(corrplot)

Biblioteki użyte podczas uczenia maszynowego:

library(caret)

Wczytywanie danych

Poniżej znajdują się sekcje, w których odbywa się wczytywanie poszczególnych zestawów danych. W wybranych przypadkach dane są czyszcone i transformowane do wygodniejszej postaci.

Wymiana walut

Z pliku data/CurrencyExchangeRates.csv odczytywane są wskaźniki wymiany walut. Wskaźnik mówi ile wart jest jeden dolar amerykański w danej walucie. Podczas wczytywania konieczne jest wskazanie formatu zapisu daty dla kolumny Date. Pozostałe atrybuty są poprawnie automatycznie rozpoznawane jako liczby rzeczywiste.

df_CurrencyExchangeRates <- read_csv(
  "data/CurrencyExchangeRates.csv",
  col_types = list(Date = col_date(format = "%Y-%m-%d"))
)

Następuje transformacja do dłuższej postaci, gdzie rodzaj waluty jest reprezentowany przez atrybut currency, a wartość jego wskaźnika danego dnia opisana jest w atrybucie rate.

df_CurrencyExchangeRates <- df_CurrencyExchangeRates %>%
  pivot_longer(
    cols = -Date,
    names_to = "currency",
    values_to = "rate"
  ) %>%
  mutate(currency = as.factor(currency))

Rozmiar zbioru danych:

## [1] 304878      3

Atrybuty zbioru danych:

## [1] "Date"     "currency" "rate"

Statystyki wybranych atrybutów zbioru danych:

##       Date                         currency           rate         
##  Min.   :1995-01-02   Algerian Dinar   :  5978   Min.   :    0.09  
##  1st Qu.:2000-10-05   Australian Dollar:  5978   1st Qu.:    1.44  
##  Median :2006-07-06   Bahrain Dinar    :  5978   Median :    5.65  
##  Mean   :2006-07-27   Bolivar Fuerte   :  5978   Mean   :  485.89  
##  3rd Qu.:2012-05-08   Botswana Pula    :  5978   3rd Qu.:   57.11  
##  Max.   :2018-05-02   Brazilian Real   :  5978   Max.   :68827.50  
##                       (Other)          :269010   NA's   :61189

Ceny złota

Plik data/Gold prices.csv zawiera ceny złota podane w trzech walutach dla danego dnia w dwóch porach: przed południem oraz po południu.

df_Gold_prices <- read_csv("data/Gold prices.csv", show_col_types = FALSE)
colnames(df_Gold_prices)
## [1] "Date"      "USD (AM)"  "USD (PM)"  "GBP (AM)"  "GBP (PM)"  "EURO (AM)"
## [7] "EURO (PM)"

Wyliczona zostaje średnia cena dla danej waluty danego dnia, aby móc analizować wartości z mniejszą dokładnością na poziomie jednego dnia.

df_Gold_prices <- df_Gold_prices %>%
  mutate(`USD (MEAN)` = (`USD (AM)` + `USD (PM)`) / 2) %>%
  mutate(`GBP (MEAN)` = (`GBP (AM)` + `GBP (PM)`) / 2) %>%
  mutate(`EURO (MEAN)` = (`EURO (AM)` + `EURO (PM)`) / 2)

Zbiór danych zostaje przetransformowany: zakodowane w nazwach kolumn rodzaj waluty oraz typ wartości interpretowane są jako osobne atrybuty.

df_Gold_prices <- df_Gold_prices %>%
  pivot_longer(
    cols = -Date,
    names_to = c("currency", "type"), names_pattern = "([A-Z]*) \\(([A-Z]*)\\)",
    values_to = "price"
  )

Określenie nominalnych typów dla wybranych kolumn.

df_Gold_prices <- df_Gold_prices %>%
  mutate(across(c(currency, type), as.factor))

Rozmiar zbioru danych:

## [1] 122265      4

Atrybuty zbioru danych:

## [1] "Date"     "currency" "type"     "price"

Statystyki atrybutów zbioru danych:

##       Date            currency       type           price        
##  Min.   :1968-01-02   EURO:40755   AM  :40755   Min.   :  14.48  
##  1st Qu.:1981-06-10   GBP :40755   MEAN:40755   1st Qu.: 217.67  
##  Median :1994-11-14   USD :40755   PM  :40755   Median : 340.53  
##  Mean   :1994-11-16                             Mean   : 530.47  
##  3rd Qu.:2008-04-23                             3rd Qu.: 877.00  
##  Max.   :2021-09-29                             Max.   :2067.15  
##                                                 NA's   :24204

Wgląd do zbioru danych:

## # A tibble: 122,265 x 4
##    Date       currency type  price
##    <date>     <fct>    <fct> <dbl>
##  1 2021-09-29 USD      AM    1742.
##  2 2021-09-29 USD      PM    1737.
##  3 2021-09-29 GBP      AM    1289.
##  4 2021-09-29 GBP      PM    1291.
##  5 2021-09-29 EURO     AM    1493.
##  6 2021-09-29 EURO     PM    1492.
##  7 2021-09-29 USD      MEAN  1739.
##  8 2021-09-29 GBP      MEAN  1290.
##  9 2021-09-29 EURO     MEAN  1493.
## 10 2021-09-28 USD      AM    1740.
## # ... with 122,255 more rows

Indeks giełdowy S&P Composite

Informacje wczytane z pliku data/S&P Composite.csv na temat indeksu S&P Composite nie ulegają żadnym wstępnym zmianom.

df_SP_Composite <- read_csv("data/S&P Composite.csv", show_col_types = FALSE)

Rozmiar zbioru danych:

## [1] 1810   10

Atrybuty zbioru danych:

##  [1] "Year"                         "S&P Composite"               
##  [3] "Dividend"                     "Earnings"                    
##  [5] "CPI"                          "Long Interest Rate"          
##  [7] "Real Price"                   "Real Dividend"               
##  [9] "Real Earnings"                "Cyclically Adjusted PE Ratio"

Statystyki atrybutów zbioru danych:

##       Year            S&P Composite         Dividend          Earnings       
##  Min.   :1871-01-31   Min.   :   2.730   Min.   : 0.1800   Min.   :  0.1600  
##  1st Qu.:1908-10-07   1st Qu.:   7.902   1st Qu.: 0.4202   1st Qu.:  0.5608  
##  Median :1946-06-15   Median :  17.370   Median : 0.8717   Median :  1.4625  
##  Mean   :1946-06-15   Mean   : 327.968   Mean   : 6.7321   Mean   : 15.3714  
##  3rd Qu.:1984-02-21   3rd Qu.: 164.400   3rd Qu.: 7.0525   3rd Qu.: 14.7258  
##  Max.   :2021-10-31   Max.   :4493.280   Max.   :59.6800   Max.   :158.7400  
##                                          NA's   :4         NA's   :4         
##       CPI         Long Interest Rate   Real Price     Real Dividend   
##  Min.   :  6.28   Min.   : 0.620     Min.   :  73.9   Min.   : 5.445  
##  1st Qu.: 10.20   1st Qu.: 3.171     1st Qu.: 186.6   1st Qu.: 9.417  
##  Median : 20.35   Median : 3.815     Median : 283.3   Median :14.411  
##  Mean   : 62.39   Mean   : 4.504     Mean   : 622.0   Mean   :17.498  
##  3rd Qu.:102.28   3rd Qu.: 5.139     3rd Qu.: 707.0   3rd Qu.:22.301  
##  Max.   :273.98   Max.   :15.320     Max.   :4477.2   Max.   :63.511  
##                                                       NA's   :4       
##  Real Earnings     Cyclically Adjusted PE Ratio
##  Min.   :  4.576   Min.   : 4.784              
##  1st Qu.: 14.063   1st Qu.:11.898              
##  Median : 23.524   Median :16.381              
##  Mean   : 34.907   Mean   :17.215              
##  3rd Qu.: 43.768   3rd Qu.:20.913              
##  Max.   :159.504   Max.   :44.198              
##  NA's   :4         NA's   :120

Wgląd do zbioru danych:

## # A tibble: 1,810 x 10
##    Year       `S&P Composite` Dividend Earnings   CPI `Long Interest Rate`
##    <date>               <dbl>    <dbl>    <dbl> <dbl>                <dbl>
##  1 2021-10-31           3701.     NA        NA   260.                 0.93
##  2 2021-09-30           4493.     NA        NA   274.                 1.29
##  3 2021-08-31           4454.     NA        NA   274.                 1.28
##  4 2021-07-31           4364.     NA        NA   273.                 1.32
##  5 2021-06-30           4238.     57.9     159.  272.                 1.52
##  6 2021-05-31           4168.     57.8     149.  269.                 1.62
##  7 2021-04-30           4141.     57.7     138.  267.                 1.64
##  8 2021-03-31           3911.     57.6     128.  265.                 1.61
##  9 2021-02-28           3883.     57.8     117.  263.                 1.26
## 10 2021-01-31           3794.     58.1     105.  262.                 1.08
## # ... with 1,800 more rows, and 4 more variables: Real Price <dbl>,
## #   Real Dividend <dbl>, Real Earnings <dbl>,
## #   Cyclically Adjusted PE Ratio <dbl>

Informacje o bitcoin’ie

W plikach znajdujących się w folderze data/Bitcoin/ dostępne są wybrane cztery statystyki bitcoin’a.

BCHAIN_value_names <- list("DIFF", "HRATE", "MKPRU", "TRVOU")
BCHAIN_filenames <- paste("BCHAIN-", BCHAIN_value_names, ".csv", sep = "")
BCHAIN_pathnames <- paste("data/Bitcoin/", BCHAIN_filenames, sep = "")

dfs_BCHAIN <- lapply(BCHAIN_pathnames, read_csv, show_col_types = FALSE)

Po wczytaniu poszczególnych plików następuje połączenie zbiorów danych do wspólnej relacji opisującej statystyki bitcoin’a dla danego dnia.

for (i in seq_along(BCHAIN_value_names)) {
  value_name <- BCHAIN_value_names[[i]]
  dfs_BCHAIN[[i]] <- rename(dfs_BCHAIN[[i]], !!value_name := Value)
}

func_BCHAIN_JOIN <- function(...) {
  df1 = list(...)[[1]]
  df2 = list(...)[[2]]
  df_joined = full_join(df1, df2, by = "Date")
  return(df_joined)
}

df_BCHAIN <- Reduce(func_BCHAIN_JOIN, dfs_BCHAIN)

Rozmiar zbioru danych:

## [1] 4661    5

Atrybuty zbioru danych:

## [1] "Date"  "DIFF"  "HRATE" "MKPRU" "TRVOU"

Statystyki atrybutów zbioru danych:

##       Date                 DIFF               HRATE               MKPRU        
##  Min.   :2009-01-02   Min.   :0.000e+00   Min.   :        0   Min.   :    0.0  
##  1st Qu.:2012-03-12   1st Qu.:1.689e+06   1st Qu.:       12   1st Qu.:    7.2  
##  Median :2015-05-21   Median :4.881e+10   Median :   356089   Median :  431.9  
##  Mean   :2015-05-21   Mean   :3.664e+12   Mean   : 26458258   Mean   : 5141.2  
##  3rd Qu.:2018-07-29   3rd Qu.:5.364e+12   3rd Qu.: 38265984   3rd Qu.: 6499.1  
##  Max.   :2021-10-06   Max.   :2.505e+13   Max.   :198514006   Max.   :63554.4  
##                       NA's   :1           NA's   :2                            
##      TRVOU          
##  Min.   :0.000e+00  
##  1st Qu.:1.948e+05  
##  Median :6.824e+06  
##  Mean   :1.467e+08  
##  3rd Qu.:1.484e+08  
##  Max.   :5.352e+09  
## 

Wgląd do zbioru danych:

## # A tibble: 4,661 x 5
##    Date          DIFF      HRATE  MKPRU      TRVOU
##    <date>       <dbl>      <dbl>  <dbl>      <dbl>
##  1 2021-10-05 1.99e13 162177736. 49144. 370887916.
##  2 2021-10-04 1.90e13 147411968. 48206. 183312374.
##  3 2021-10-03 1.90e13 141656680. 47727. 184243788.
##  4 2021-10-02 1.90e13 177543039. 48140. 688291407.
##  5 2021-10-01 1.90e13 132212901. 43758. 360342502.
##  6 2021-09-30 1.90e13 161488615. 41522. 221224597.
##  7 2021-09-29 1.90e13 122769122. 41011. 275833680.
##  8 2021-09-28 1.90e13 143545435. 42238. 249740960.
##  9 2021-09-27 1.90e13 146378569. 43183. 231309917.
## 10 2021-09-26 1.90e13 131268523. 42742. 132297206.
## # ... with 4,651 more rows

Wskaźniki rozwoju gospodarek świata

W pliku data/World_Development_Indicators.xlsx dostępne są informacje o możliwościach gospodarczych i rozwoju poszczególnych krajów mierzonym przez ponad 100 statystyk.

df_World_Development_Indicators <-  read_xlsx(
  path = "data/World_Development_Indicators.xlsx",
  na = ".."
)

Wczytane dane pochodzą z arkusza kalkulacyjnego. Na jego końcu znajduje się informacja o źródle pochodzenia i dacie utworzenia. Informacje te są widoczne w obiekcie zbioru danych w ostatnich pięciu wierszach, które należy usunąć.

df_World_Development_Indicators <- head(df_World_Development_Indicators, n = -5)

Następuje transformacja wczytanego zioru danych - atrybuty wskazujące rok zostają skondensowane jako atrybut year.

df_World_Development_Indicators <- df_World_Development_Indicators %>%
  pivot_longer(
    cols = `1970 [YR1970]`:`2020 [YR2020]`,
    names_to = "year", names_pattern = "([0-9]*) \\[[0-9A-Z]*\\]",
    values_to = "value"
  )

Rozmiar zbioru danych:

## [1] 2259504       6

Atrybuty zbioru danych:

## [1] "Country Name" "Country Code" "Series Name"  "Series Code"  "year"        
## [6] "value"

Statystyki atrybutów zbioru danych:

##  Country Name       Country Code       Series Name        Series Code       
##  Length:2259504     Length:2259504     Length:2259504     Length:2259504    
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##      year               value           
##  Length:2259504     Min.   :-4.813e+14  
##  Class :character   1st Qu.: 6.000e+00  
##  Mode  :character   Median : 4.100e+01  
##                     Mean   : 3.516e+11  
##                     3rd Qu.: 9.240e+03  
##                     Max.   : 1.021e+16  
##                     NA's   :1130176

Wgląd do zbioru danych:

## # A tibble: 2,259,504 x 6
##    `Country Name` `Country Code` `Series Name`         `Series Code` year  value
##    <chr>          <chr>          <chr>                 <chr>         <chr> <dbl>
##  1 Afghanistan    AFG            Urban population gro~ SP.URB.GROW   1970   5.75
##  2 Afghanistan    AFG            Urban population gro~ SP.URB.GROW   1971   5.86
##  3 Afghanistan    AFG            Urban population gro~ SP.URB.GROW   1972   5.90
##  4 Afghanistan    AFG            Urban population gro~ SP.URB.GROW   1973   5.82
##  5 Afghanistan    AFG            Urban population gro~ SP.URB.GROW   1974   5.63
##  6 Afghanistan    AFG            Urban population gro~ SP.URB.GROW   1975   5.34
##  7 Afghanistan    AFG            Urban population gro~ SP.URB.GROW   1976   5.11
##  8 Afghanistan    AFG            Urban population gro~ SP.URB.GROW   1977   4.85
##  9 Afghanistan    AFG            Urban population gro~ SP.URB.GROW   1978   4.37
## 10 Afghanistan    AFG            Urban population gro~ SP.URB.GROW   1979   3.61
## # ... with 2,259,494 more rows

Szczegółowa analiza wartości atrybutów

Poniżej przedstawione są podstawowe operacje sprawdzające zawartość danych oraz ich istotne właściwości.

Wymiana walut

Lista walut wraz z licznikiem wartości pustych:

Wykresy wybranych walut w czasie:

Ograniczenie poglądu do lat 2005-2015, bez waluty Russian Ruble:

Ceny złota

Wykres średnich dziennych cen złota w trzech walutach.

Wykres średnich dziennych cen złota w trzech walutach w roku 2019. Wyraźnie widoczna jest pewna korelacja między cenami w różnych walutach. Najprawdopodobniej jest to zgodne z kursami wymian między walutami.

Indeks giełdowy S&P Composite

Wykresy wszystkich wartości wszystkich atrybutów danych S&P Composite. W celu uzyskania lepszej czytelności, na poszczególnych wykresach zostały zestawione ze sobą atrybuty, dla których przyjmowane są wartości o podobnym rzędzie wielkości.

Na tle wszystkich atrybutów najbardziej wyróżnia się atrybut Long Interest Rate, którego wykres przyjmuje inne trendy w odróżnieniu od wykresów pozostałych atrybutów.

Informacje o bitcoin’ie

Poniżej wykresy czterech własności Bitcoin’a (DIFF, HRATE, MKPRU, TRVOU). Widoczne jest ożywienie badanych wartości w roku 2017.

Wskaźniki rozwoju gospodarek świata

Liczba różnych wartości:

## [1] "Liczba lat, w których zbierane były statystyki:  51"
## [1] "Liczba krajów, dla których zbierane były statystyki:  208"
## [1] "Liczba statystyk, która została uwzględniona w badaniach:  213"

Poniżej w tabeli dla danej statystyki zliczona została liczba wartości pustych.

Dla większości statystyk ponad 25% wartości to wartości puste. Dalsza analiza będzie się opierać na statystykach, dla których zebrano dużo wartości. Wybrane zostają statystyki, które posiadają określone ponad 75% wartości.

Lista krajów, dla których zbierane były statystyki:

Pod atrybutem Country Name kryją się nazwy, które nie odnoszą się do krajów. Są to regiony danego poziomu gospodarczego, dla którego statystyki zostały podsumowane. Tak skumulowane statystyki mogą być znacznie bardziej przydatne, niż statystyki dla pojedynczych krajów. Poniżej lista specjalnych wartości atrybutu Country Name.

Specjalne wartości atrybutu Country Name
Low & middle income
Low income
Lower middle income
Middle income
World
Upper middle income
High income

Poniżej w tabeli dla danego kraju (podobnie jak wcześniej dla danej statystyki) zliczona została liczba wartości pustych. Po wcześniejszym uprzątnięciu statystyk z wartościami pustymi widać, że pozostawione statystyki dla danego kraju są w większości wypełnione. Tylko dla kilku krajów poziom niewypełnienia danych sięga kilkunastu procent.

Badanie korelacji

Korelacja między statystykami w danym państwie

Sprawdzenie istnienia korelacji między statystykami dla Polski.

Należy zwrócić uwagę, na atrybuty, które występują ze sobą w silnej korelacji pozytywnej lub negatywnej. W wyraźniejszym wykryciu tych korelacji pomoże zmodyfikowana macierz korelacji, dla której wartości w przyjętym przedziale <-0.9; 0.9> zostaną wyzerowane.

Z powyższego wykresu można odczytać grupę atrybutów na pozycjach 6, 7, 19, 28, 30, 33, 36, 37, 38, 39, które są ze sobą skorelowane. Istnieje też druga grupa atrybutów, które są ze sobą skorelowane pozytywnie, ale za to negatywnie z pierwszą grupą atrybutów. Są to atrybuty na pozycjach 21, 22, 24, 25, 34, 35.

Pierwsza grupa atrybutów:

##  [1] "Survival to age 65, female (% of cohort)"                
##  [2] "Survival to age 65, male (% of cohort)"                  
##  [3] "Population ages 65 and above (% of total population)"    
##  [4] "Life expectancy at birth, total (years)"                 
##  [5] "GDP per capita (current US$)"                            
##  [6] "GDP (current US$)"                                       
##  [7] "CO2 emissions from liquid fuel consumption (kt)"         
##  [8] "CO2 emissions from liquid fuel consumption (% of total)" 
##  [9] "CO2 emissions from gaseous fuel consumption (kt)"        
## [10] "CO2 emissions from gaseous fuel consumption (% of total)"

Druga grupa atrybutów:

## [1] "Population ages 0-14 (% of total population)"          
## [2] "Number of under-five deaths"                           
## [3] "Mortality rate, infant (per 1,000 live births)"        
## [4] "Methane emissions (kt of CO2 equivalent)"              
## [5] "CO2 emissions from solid fuel consumption (% of total)"
## [6] "CO2 emissions from solid fuel consumption (kt)"

Naturalną rzeczą wydaje się fakt, że skorelowane ze sobą są: - procent mężczyzn oraz procent kobiet, którzy dożywają wieku 65 lat i powyżej, a także oczekiwana długość życia - liczba zgonów poniżej 5 roku życia i wskaźnik przeżycia dziecka przy porodzie - produkt krajowy brutto dla całego kraju oraz w przeliczeniu na jednego mieszkańca

Również porównując między dwoma grupami atrybutów, uzasadnione jest występowanie korelacji negatywnej między śmiertelnością, a żywotnością.

Poza tymi oczywistymi korelacjami, można natomiast odnaleźć ciekawą zależność między długością życia, bogactwem państwa, a źródłem produkcji gazu CO2. Prawdopodobnie to osiągnięcie długiego wieku życia jest związane z wysokim bogactwem danego państwa (GDP) oraz z używaniem paliw gazowych/płynnych, które są źródłem emisji CO2. Spalanie paliw stałych musi zatem wpływać negatywnie na zdrowie.

Regresor przewidujący cenę złota

Proponowany regresor będzie próbował oszacować wartość złota wyrażoną w dolarach na podstawie obecnych wskaźników wymiany walut.

Przygotowanie zbioru danych - Wybierane są waluty, dla których nie brakuje informacji o wskaźniku wymiany dla więcej niż około 35% wpisów (przyjęto granice 2000 wartości pustych). Dane o cenie złota jest łączona ze wskaźnikami wymiany walut we wspólny zbiór danych reg_data.

reg_Gold_prices <- df_Gold_prices %>%
  filter(type == "MEAN", currency == "USD") %>%
  select(Date, price) %>%
  drop_na()

reg_important_currency <- df_CurrencyExchangeRates_NA_count %>%
  filter(`NA counts` < 2000) %>%
  select(currency) %>%
  pull()

reg_CurrencyExchangeRates <- df_CurrencyExchangeRates %>%
  filter(currency %in% reg_important_currency) %>%
  pivot_wider(
    names_from = currency,
    values_from = rate
  )

reg_data <- inner_join(reg_Gold_prices, reg_CurrencyExchangeRates, by="Date")

Ustalenie stałej wartości dla źródła liczb losowych - powtarzalność eksperymentu uczenia maszynowego.

set.seed(44)

Podział zbioru na treningowy i testowy

reg_idx_train <- createDataPartition(y = reg_data$price, p = 0.7, list = FALSE)

reg_train <- reg_data[reg_idx_train, ]
reg_test <- reg_data[-reg_idx_train, ]

Schemat uczenia

ctrl <- trainControl(
  method = "repeatedcv",
  number = 2,
  repeats = 5
)

Uczenie

fit <- train(
  price ~ .,
  data = reg_train,
  method = "lm",
  trControl = ctrl,
  intercept = 0.0,
  na.action = na.exclude
)

Podsumowanie wyników uczenia regresora

fit$results
##   intercept     RMSE  Rsquared     MAE   RMSESD  RsquaredSD    MAESD
## 1      TRUE 48.28637 0.9841892 36.3396 1.943096 0.001023219 1.248938
summary(fit)
## 
## Call:
## lm(formula = .outcome ~ ., data = dat, intercept = 0)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -176.196  -27.695   -0.281   25.560  202.646 
## 
## Coefficients: (7 not defined because of singularities)
##                                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                         2.034e+03  8.452e+02   2.406 0.016397 *  
## Date                                7.377e-02  3.173e-02   2.325 0.020378 *  
## `\\`Australian Dollar\\``           1.025e+03  1.275e+02   8.045 4.30e-15 ***
## `\\`Bahrain Dinar\\``                      NA         NA      NA       NA    
## `\\`Botswana Pula\\``              -1.167e+03  5.883e+02  -1.984 0.047722 *  
## `\\`Brazilian Real\\``              2.147e+01  1.867e+01   1.150 0.250739    
## `\\`Brunei Dollar\\``              -7.058e+02  2.073e+02  -3.405 0.000705 ***
## `\\`Canadian Dollar\\``             2.382e+02  8.463e+01   2.815 0.005030 ** 
## `\\`Chilean Peso\\``               -5.712e-01  1.264e-01  -4.518 7.44e-06 ***
## `\\`Chinese Yuan\\``               -1.765e+02  3.280e+01  -5.382 1.04e-07 ***
## `\\`Colombian Peso\\``              1.139e-01  2.854e-02   3.992 7.33e-05 ***
## `\\`Czech Koruna\\``               -6.729e+00  5.796e+00  -1.161 0.246079    
## `\\`Danish Krone\\``               -8.384e+00  5.269e+01  -0.159 0.873618    
## Euro                               -2.824e+02  2.489e+02  -1.135 0.256801    
## `\\`Hungarian Forint\\``            2.421e+00  5.073e-01   4.773 2.26e-06 ***
## `\\`Icelandic Krona\\``            -1.013e+00  4.067e-01  -2.492 0.012966 *  
## `\\`Indian Rupee\\``                1.758e+01  7.499e+00   2.344 0.019397 *  
## `\\`Indonesian Rupiah\\``          -1.251e-02  7.776e-03  -1.609 0.108154    
## `\\`Iranian Rial\\``               -2.720e-03  1.500e-03  -1.813 0.070286 .  
## `\\`Israeli New Sheqel\\``          1.913e+02  2.539e+01   7.536 1.69e-13 ***
## `\\`Japanese Yen\\``               -6.622e+00  6.192e-01 -10.694  < 2e-16 ***
## `\\`Korean Won\\``                  1.023e-02  7.272e-02   0.141 0.888156    
## `\\`Kuwaiti Dinar\\``              -1.420e+03  8.955e+02  -1.586 0.113299    
## `\\`Libyan Dinar\\``               -4.863e+02  1.032e+02  -4.711 3.03e-06 ***
## `\\`Malaysian Ringgit\\``           7.518e+01  3.605e+01   2.085 0.037432 *  
## `\\`Nepalese Rupee\\``             -1.559e+01  4.823e+00  -3.233 0.001291 ** 
## `\\`New Zealand Dollar\\``          2.289e+01  1.268e+02   0.181 0.856813    
## `\\`Norwegian Krone\\``            -2.850e+01  1.594e+01  -1.787 0.074345 .  
## `\\`Pakistani Rupee\\``             5.373e-01  1.150e+00   0.467 0.640610    
## `\\`Polish Zloty\\``               -4.815e+00  3.496e+01  -0.138 0.890508    
## `\\`Qatar Riyal\\``                        NA         NA      NA       NA    
## `\\`Rial Omani\\``                         NA         NA      NA       NA    
## `\\`Saudi Arabian Riyal\\``                NA         NA      NA       NA    
## `\\`Singapore Dollar\\``                   NA         NA      NA       NA    
## `\\`South African Rand\\``         -1.520e+00  5.782e+00  -0.263 0.792677    
## `\\`Sri Lanka Rupee\\``            -2.073e+00  7.777e-01  -2.666 0.007884 ** 
## `\\`Swedish Krona\\``               8.261e+00  1.586e+01   0.521 0.602662    
## `\\`Swiss Franc\\``                -1.893e+02  9.802e+01  -1.932 0.053852 .  
## `\\`Thai Baht\\``                   2.650e-01  3.702e+00   0.072 0.942960    
## `\\`Trinidad And Tobago Dollar\\``  2.329e+02  6.026e+01   3.864 0.000123 ***
## `\\`U.A.E. Dirham\\``                      NA         NA      NA       NA    
## `\\`U.K. Pound Sterling\\``        -4.679e+01  5.473e+01  -0.855 0.392845    
## `\\`U.S. Dollar\\``                        NA         NA      NA       NA    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 45.52 on 631 degrees of freedom
## Multiple R-squared:  0.9865, Adjusted R-squared:  0.9858 
## F-statistic:  1320 on 35 and 631 DF,  p-value: < 2.2e-16

predykcja

lrResult <- predict(fit, newdata = reg_test)
length(lrResult)
## [1] 254
length(reg_test$price)
## [1] 1736

Chętnie bym porównał wyniki predykcji wraz rzeczywistymi wartościami. Niestety, niee mam już czasu, żeby przeanalizować, dlaczego liczba zwracanych wyników funkcji predict() różni się od rekordów w zbiorze testowym.